package com.example.demo;

import com.example.service.AnnotationBasedUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 基于注解的AOP演示类
 * 
 * 这个演示展示了注解驱动AOP与硬编码切点的区别：
 * 1. 更精确的控制
 * 2. 更好的可配置性
 * 3. 更清晰的代码表达
 */
@Component
@Order(2)  // 确保在原始演示之后运行
public class AnnotationAopDemo implements CommandLineRunner {

    @Autowired
    private AnnotationBasedUserService annotationBasedUserService;

    @Override
    public void run(String... args) throws Exception {
        System.out.println("\n\n🎯 ========== 基于注解的AOP演示 ==========");
        System.out.println("🔥 这才是实际项目中常用的AOP方式！");
        System.out.println("📌 注解方式的优势：");
        System.out.println("   ✨ 精确控制：只有标注了注解的方法才会被拦截");
        System.out.println("   ⚙️ 可配置：通过注解参数定制AOP行为");
        System.out.println("   📖 清晰：在方法上直接看到应用的横切关注点");
        System.out.println("   🔧 易维护：只需添加/删除注解，无需修改切面代码");
        System.out.println();

        // 演示1：权限、日志、性能监控组合
        System.out.println("📋 【演示1】多注解组合 - 权限+日志+性能监控");
        System.out.println("═══════════════════════════════════════════════");
        try {
            String result = annotationBasedUserService.createUser("李四", "lisi@example.com");
            System.out.println("🎉 最终结果: " + result);
        } catch (Exception e) {
            System.out.println("💥 操作失败: " + e.getMessage());
        }

        System.out.println("\n\n");

        // 演示2：权限检查失败
        System.out.println("📋 【演示2】权限检查失败演示");
        System.out.println("═══════════════════════════════════════════════");
        try {
            annotationBasedUserService.deleteUser(100L);
        } catch (SecurityException e) {
            System.out.println("🛑 权限检查拦截成功: " + e.getMessage());
        }

        System.out.println("\n\n");

        // 演示3：只有日志，没有权限检查
        System.out.println("📋 【演示3】仅日志记录 - 精确控制AOP行为");
        System.out.println("═══════════════════════════════════════════════");
        String userInfo = annotationBasedUserService.getUserInfo(200L);
        System.out.println("📄 查询结果: " + userInfo);

        System.out.println("\n\n");

        // 演示4：性能监控超时警告
        System.out.println("📋 【演示4】性能监控 - 超时警告");
        System.out.println("═══════════════════════════════════════════════");
        String updateResult = annotationBasedUserService.updateUser(300L, "新名称");
        System.out.println("📄 更新结果: " + updateResult);

        System.out.println("\n\n");

        // 演示5：无AOP方法对比
        System.out.println("📋 【演示5】无注解方法 - 不会触发任何AOP");
        System.out.println("═══════════════════════════════════════════════");
        String internalResult = annotationBasedUserService.internalMethod();
        System.out.println("📄 内部方法结果: " + internalResult);

        System.out.println("\n\n");

        // 演示6：组合注解
        System.out.println("📋 【演示6】组合注解 - 日志+性能监控");
        System.out.println("═══════════════════════════════════════════════");
        String batchResult = annotationBasedUserService.batchOperation(new String[]{"用户1", "用户2", "用户3"});
        System.out.println("📄 批量操作结果: " + batchResult);

        System.out.println("\n\n🎯 基于注解的AOP演示完成！");
        System.out.println("📊 对比总结：");
        System.out.println("┌─────────────────┬──────────────────┬──────────────────┐");
        System.out.println("│     特性        │   硬编码切点     │   基于注解       │");
        System.out.println("├─────────────────┼──────────────────┼──────────────────┤");
        System.out.println("│ 灵活性          │       低         │       高         │");
        System.out.println("│ 可维护性        │       低         │       高         │");
        System.out.println("│ 代码清晰度      │       中         │       高         │");
        System.out.println("│ 配置复杂度      │       高         │       低         │");
        System.out.println("│ 运行时性能      │       高         │       中         │");
        System.out.println("│ 实际项目使用    │      少见        │      常用        │");
        System.out.println("└─────────────────┴──────────────────┴──────────────────┘");
    }
} 